package reflection;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author 吴阳基
 * @datetime 2024/1/3 14:17
 */
public class ShiLi7 {
    @Test
    public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        Class<?> clz = Class.forName("reflection.Person");
        //获取Person的无参构造：public Person()
        Constructor<?> c1 = clz.getDeclaredConstructor();
        //Person的无参构造为public，这里可以直接访问
        Object obj = c1.newInstance();
        System.out.println(obj);

        //获取Person的单参构造：private Person(String)
        Constructor<?> c2 = clz.getDeclaredConstructor(String.class);
        //Person的单参构造为private，这里已超出其范围，不能直接访问
        //通过setAccessible方法，设定为可以访问
        c2.setAccessible(true);
        obj = c2.newInstance("new Person");
        System.out.println(obj);

        //获取Person的三参构造：protected Person(String,String,String)
        Constructor<?> c3 = clz.getDeclaredConstructor(String.class, String.class, String.class);
        //Person的三参构造为protected，这里已超出其访问范围，不能直接访问
        //通过setAccessible方法，设定为可以访问
        c3.setAccessible(true);
        obj = c3.newInstance("new Person","beijing","Hello!");
        System.out.println(obj);
    }
}
